home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / r2l.lha / r2l / src / r2l.lalr < prev    next >
Text File  |  1992-08-18  |  7KB  |  280 lines

  1. (* $Id: rex.lalr,v 1.6 90/06/11 11:28:10 grosch rel Locker: grosch $ *)
  2.  
  3. (* $Log:    rex.lalr,v $
  4.  *)
  5.  
  6. (* Ich, Doktor Josef Grosch, Informatiker, Nov. 1987 *)
  7.  
  8. GLOBAL {
  9.  
  10. FROM SYSTEM    IMPORT ADR;
  11. FROM Strings    IMPORT tString, ArrayToString;
  12. FROM StringMem    IMPORT WriteString;
  13. FROM Idents    IMPORT tIdent, MakeIdent, WriteIdent, GetString;
  14. FROM Texts    IMPORT tText, WriteText;
  15. FROM IO        IMPORT StdOutput;
  16. FROM StdIO    IMPORT WriteC, WriteS, WriteI, WriteNl;
  17. FROM Errors    IMPORT ErrorMessageI;
  18. FROM DefTable    IMPORT NoDef, DefRange, tKind, GetKind, MakeIdentDef, GetDef;
  19.  
  20. CONST
  21.    IdentUndefined    = 10    ;
  22.    ImproperUse        = 11    ;
  23.    IdentDefBefore    = 12    ;
  24.    Error        = 3    ;
  25.    String        = 7    ;
  26.  
  27. TYPE
  28.    tParsAttribute = RECORD Scan: Scanner.tScanAttribute; END;
  29.  
  30. VAR
  31.    string    : tString;
  32.    ANY        : tIdent;
  33.    Definition    : DefRange;
  34.    complement    : BOOLEAN;
  35.    Export, Global, Local, Begin, Close, Default, Eof: tText;
  36.  
  37. PROCEDURE WriteChar (Ch: CHAR; InClass: BOOLEAN);
  38.    BEGIN
  39.       IF ('A' <= Ch) AND ( Ch <= 'Z') OR
  40.          ('a' <= Ch) AND ( Ch <= 'z') OR
  41.          ('0' <= Ch) AND ( Ch <= '9') THEN
  42.      WriteC (Ch);
  43.       ELSE
  44.      CASE Ch OF
  45.         | 012C: WriteS ("\n");
  46.         | 011C: WriteS ("\t");
  47.         | 013C: WriteS ("\v");
  48.         | 010C: WriteS ("\b");
  49.         | 015C: WriteS ("\r");
  50.         | 014C: WriteS ("\f");
  51.         | '"' : WriteS ('\"');
  52.         | ']' : WriteS ("\]");
  53.         | '.' : WriteS ("\.");
  54.         | '^' : WriteS ("\^");
  55.         | '-' : WriteS ("\-");
  56.         | '\' : WriteS ("\\");
  57.      ELSE
  58.         IF InClass THEN
  59.            WriteC (Ch);
  60.         ELSE
  61.            WriteC ('"');
  62.            WriteC (Ch);
  63.            WriteC ('"');
  64.         END;
  65.      END;
  66.       END;
  67.    END WriteChar;
  68. }
  69.  
  70. BEGIN { ArrayToString ("ANY", string); ANY := MakeIdent (string); }
  71.  
  72. TOKEN
  73.  
  74.    Ident    = 1
  75.    Number    = 2
  76.    String    = 3
  77.    Char        = 4
  78.    TargetCode    = 5
  79.    'EXPORT'    = 32
  80.    'GLOBAL'    = 6
  81.    'LOCAL'    = 31
  82.    'BEGIN'    = 7
  83.    'CLOSE'    = 8
  84.    EOF        = 34
  85.    DEFAULT    = 36
  86.    DEFINE    = 9
  87.    START    = 10
  88.    RULES    = 11
  89.    NOT        = 30
  90.    '.'        = 12
  91.    ','        = 13
  92.    '='        = 14
  93.    ':'        = 15
  94.    ':-'        = 35
  95.    '#'        = 33
  96.    '/'        = 16
  97.    '|'        = 17
  98.    '+'        = 18
  99.    '-'        = 19
  100.    '*'        = 20
  101.    '?'        = 21
  102.    '('        = 22
  103.    ')'        = 23
  104.    '['        = 24
  105.    ']'        = 25
  106.    '{'        = 26
  107.    '}'        = 27
  108.    '<'        = 28
  109.    '>'        = 29
  110.  
  111. OPER
  112.  
  113.    LEFT    COMPL
  114.    LEFT    '|'
  115.    LEFT    SEQUENCE
  116.    LEFT    '+' '*' '?' '[' '-'
  117.    LEFT    '(' '{'
  118.    LEFT    Ident Char String
  119.  
  120. RULE
  121.  
  122. input        : code
  123.         { WriteS ("%{"); WriteNl;
  124.           WriteText (StdOutput, Export);
  125.           WriteText (StdOutput, Global);
  126.           WriteS ("%}"); WriteNl;
  127.           WriteNl;
  128.             }
  129.           define start rules
  130.         { WriteNl; WriteS ("%%"); WriteNl;
  131.           WriteNl;
  132.           WriteS ("void BeginScanner ()"); WriteNl;
  133.           WriteS ("{"); WriteNl;
  134.           WriteText (StdOutput, Begin);
  135.           WriteS ("}"); WriteNl;
  136.           WriteNl;
  137.           WriteS ("void CloseScanner ()"); WriteNl;
  138.           WriteS ("{"); WriteNl;
  139.           WriteText (StdOutput, Close);
  140.           WriteS ("}"); WriteNl;
  141.         }
  142.         .
  143. code        :
  144.         | code 'EXPORT'    TargetCode { Export  := $3.Scan.Text; }
  145.         | code 'GLOBAL'    TargetCode { Global  := $3.Scan.Text; }
  146.         | code 'LOCAL'    TargetCode { Local   := $3.Scan.Text; }
  147.         | code 'BEGIN'    TargetCode { Begin   := $3.Scan.Text; }
  148.         | code 'CLOSE'    TargetCode { Close   := $3.Scan.Text; }
  149.         | code DEFAULT    TargetCode { Default := $3.Scan.Text; }
  150.         | code EOF    TargetCode { Eof     := $3.Scan.Text;
  151.            WriteS ("/*** sorry - cannot translate EOF ***/"); WriteNl; }
  152.         .
  153. define        :
  154.         | DEFINE definitionList
  155.         .
  156. start        :
  157.         | START { WriteNl; WriteS ("%Start"); } identListDef { WriteNl; WriteNl; }
  158.         .
  159. rules        : RULES
  160.         { WriteS ("%%"); WriteNl;
  161.           WriteNl;
  162.           WriteS ("%{"); WriteNl;
  163.           WriteText (StdOutput, Local);
  164.           WriteS ("%}"); WriteNl;
  165.           WriteNl;
  166.         }
  167.           ruleList
  168.         { WriteS ('" "    ;'); WriteNl;
  169.           WriteS ("\t    ;"); WriteNl;
  170.           WriteS ("\n    ;"); WriteNl;
  171.           WriteS (".    {");
  172.           WriteText (StdOutput, Default);
  173.           WriteS ("}");
  174.           WriteNl;
  175.         }
  176.         .
  177. definitionList    :
  178.         | definitionList definition
  179.         .
  180. ruleList    :
  181.         | ruleList rule
  182.         .
  183. identListDef    : IdentDef
  184.         | identListDef IdentDef
  185.         | identListDef ',' IdentDef
  186.         .
  187. IdentDef    : Ident
  188.         { WriteC (" "); WriteIdent (StdOutput, $1.Scan.Ident); }
  189.         .
  190. identListUse    : IdentUse
  191.         | identListUse     { WriteC (","); } IdentUse
  192.         | identListUse ',' { WriteC (","); } IdentUse
  193.         .
  194. IdentUse    : Ident
  195.         { WriteIdent (StdOutput, $1.Scan.Ident); }
  196.         .
  197. definition    : Ident '='
  198.         { IF GetDef ($-1.Scan.Ident) = NoDef THEN
  199.              MakeIdentDef ($-1.Scan.Ident);
  200.           ELSE
  201.              GetString ($-1.Scan.Ident, string);
  202.              ErrorMessageI (IdentDefBefore, Error, $-1.Scan.Position,
  203.             String, ADR (string));
  204.           END;
  205.           WriteIdent (StdOutput, $-1.Scan.Ident); WriteC ("    ");
  206.         }
  207.           regExpr '.' { WriteNl; }
  208.         .
  209. rule        : patternList ':'  { WriteS ("    {"); } TargetCode
  210.         { WriteText (StdOutput, $4.Scan.Text); WriteC ("}"); WriteNl; }
  211.         | patternList ':-' { WriteS ("    {"); } TargetCode
  212.         { WriteText (StdOutput, $4.Scan.Text); WriteC ("}"); WriteNl; }
  213.         .
  214. patternList    : pattern
  215.         | patternList ',' { WriteS ("    |"); } pattern
  216.         .
  217. pattern        : startStates leftJust regExpr rightContext rightJust
  218.         .
  219. startStates    :
  220.         | '#' { WriteC ("<"); } identListUse '#' { WriteC (">"); }
  221.         | NOT '#' identListUse '#'
  222.         { WriteS ("/*** sorry - cannot translate NOT ***/"); WriteNl; }
  223.         .
  224. leftJust    :
  225.         | '<' { WriteC ("^"); }
  226.         .
  227. rightContext    :
  228.         | '/' { WriteC ("/"); } regExpr
  229.         .
  230. rightJust    :
  231.         | '>' { WriteC ("$"); }
  232.         .
  233. regExpr        : regExpr '|' { WriteC ("|"); } regExpr
  234.         | regExpr regExpr PREC SEQUENCE
  235.         | regExpr '+' { WriteC ("+"); }
  236.         | regExpr '*' { WriteC ("*"); }
  237.         | regExpr '?' { WriteC ("?"); }
  238.         | regExpr '[' Number ']'
  239.         { WriteC ("{"); WriteI ($3.Scan.Number, 0); WriteC (",");
  240.           WriteI ($3.Scan.Number, 0); WriteC ("}"); }
  241.         | regExpr '[' Number '-' Number ']'
  242.         { WriteC ("{"); WriteI ($3.Scan.Number, 0); WriteC (",");
  243.           WriteI ($5.Scan.Number, 0); WriteC ("}"); }
  244.         | '(' { WriteC ("("); } regExpr ')' { WriteC (")"); }
  245.         | compl charSet
  246.         | Char { WriteChar ($1.Scan.Ch, FALSE); }
  247.         | Ident
  248.         { Definition := GetDef ($1.Scan.Ident);
  249.           IF Definition # NoDef THEN
  250.              IF GetKind (Definition) = Ident THEN
  251.             WriteC ("{"); WriteIdent (StdOutput, $1.Scan.Ident); WriteC ("}");
  252.              ELSE
  253.             GetString ($1.Scan.Ident, string);
  254.             ErrorMessageI (ImproperUse, Error, $1.Scan.Position,
  255.                String, ADR (string));
  256.              END;
  257.           ELSE
  258.              IF $1.Scan.Ident = ANY THEN
  259.             WriteC (".");
  260.              ELSE
  261.             WriteIdent (StdOutput, $1.Scan.Ident);
  262.              END;
  263.           END;
  264.         }
  265.         | String
  266.         { WriteC ('"'); WriteString (StdOutput, $1.Scan.String); WriteC ('"'); }
  267.         .
  268. compl        : { complement := FALSE; } PREC COMPL .
  269. charSet        : '-' { complement := NOT complement; } charSet
  270.         | '{' { WriteC ("["); IF complement THEN WriteC ("^"); END; }
  271.           rangeList '}' { WriteC ("]"); }
  272.         .
  273. rangeList    :
  274.         | rangeList range
  275.         .
  276. range        : Char { WriteChar ($1.Scan.Ch, TRUE); }
  277.         | Char '-' { WriteChar ($-1.Scan.Ch, TRUE); WriteC ("-"); }
  278.           Char { WriteChar ($4.Scan.Ch, TRUE); }
  279.         .
  280.